iT邦幫忙

2021 iThome 鐵人賽

DAY 25
0

昨天介紹完淺層神經網路演算法,今天要來研究淺層神經網路程式:
首先要先設定學習率和隱藏神經元個數,在此我們使用經驗函數:
https://ithelp.ithome.com.tw/upload/images/20211009/20141654zyjRMenvSh.jpg
所以程式如下:

#設定學習率
a=0.05

#設置調節常數
a_con=2


#隱藏層神經元個數
m=int(np.sqrt(len(x_train.columns)+len(y_train.to_frame().columns))+a_con)
print(m)

所以m就是4,順道一提x_train是4欄位y_train 是1欄位
接下來要設定兩個w的權重,程式如下

np.random.seed(500)
#初始化權重for輸入到隱藏,維度(m,len(x_train.columns)
wi = np.random.uniform(-1,1,(m,len(x_train.columns)))


#初始化權重for隱藏到輸出
wi2 = np.random.uniform(-1,1,m)

此外設置,誤差最小值和誤差放置列表和最大迭帶次數:

#誤差最小值
ep_limit = 10**-3
#誤差放置列表
sum_errorList = []
#設定最大迭帶次數
iter_rate_max=1000

好準備完畢後,接下來要決定啟動函數,這邊取tanh當作啟動函數(因為它在任何點都完全可維):

所以
https://ithelp.ithome.com.tw/upload/images/20211009/20141654wUZDaXDGIL.jpg

https://ithelp.ithome.com.tw/upload/images/20211009/20141654OgAkdipDm8.jpg

所以確定好啟動函數後:
程式如下:

for j in range(iter_rate_max):
    sum_error = 0
    for i in range(len(x_train)):
        # 正向傳播
        #Xi
        xi = x_train.iloc[i]
        #wxi
        d = wi@xi
        #fk(d)-->tanh
        fk = (np.exp(d)-np.exp(-d))/(np.exp(d)+np.exp(-d))
        #W2fk(d)
        t = wi2@fk
        #predict-true
        err = t - y_train.iloc[i]
        #SSE
        sum_error += err**2
        
        # 若誤差還是比最小誤差大,就去更新wi(反向傳播)
        if np.abs(err) > ep_limit:
        	#fk(d)*a*(t-y)
            delta_w=fk*a*err
            wi2 = wi2 - delta_w
            #fk'(d)*w*a*(t-y)
            fk_d =(4/(np.exp(2*d)+2+np.exp(-2*d)))*wi2*a*err
            wi = wi - [j*xi for j in fk_d]
    #計算MSE
    MSE_error=sum_error/len(x_train)        
    sum_errorList.append(MSE_error)
    print("iter:",j,"error:",MSE_error)
    # 當連續2次總誤差小於誤差限制而且後一次誤差要比前一次小
    if len(sum_errorList) > 2 and (sum_errorList[-2]>sum_errorList[-1]) and sum_errorList[-2] - sum_errorList[-1] < ep_limit:
        break
print("最終誤差MSE為:",MSE_error)
print("wi(輸入到隱藏權重):\n",wi)
print("wi2(隱藏到輸入權重):\n",wi2)

結果如下:

最終誤差MSE為: 1.3951452403482179
wi(輸入到隱藏權重):
 [[ 4.41274874 -0.32684688 -0.94719543 -3.98609522]
 [ 5.19430544  7.87041477  3.6636928  -9.48120797]
 [ 2.49395541  0.14613217 -0.76136188  6.40090343]
 [11.0882004   5.01234925  1.64783185  7.14010145]]
wi2(隱藏到輸入權重):
 [12.68878617 -1.34260065 26.81972859  2.03718612]

有了權重後,把資料帶回去test集,程式如下:

y_pred = []
for i in range(len(x_test)):
    # 正向傳播
    xi = x_test.iloc[i]
    d = wi@xi
    fk = (np.exp(d)-np.exp(-d))/(np.exp(d)+np.exp(-d))
    t = wi2@fk
    y_pred.append(t)
print("test預測y:",y_pred)   
print("test實際y:",y_test)
print("test MSE",np.mean((y_test - y_pred)**2))

結果如下:

test預測y: [13.432542081356413, 25.926937743888953, 15.054134713533085, 14.524957997382055]
test實際y: [12.03, 29.0, 21.5, 13.75]
test MSE 13.390143777223878

好,今天淺層網路神經程式算是完成,明天就來研究CNN(卷積神經網路)

此時男孩走到了森林入口,突然他眼神恢復清明,他不知道為甚麼自己原本在木屋前面,怎麼突然走到森林的入口,突然他胸口又發出歌聲,只是這次他驚訝發現是自己聲音,同時他發現遠處,原本他出來的房子裡面好像有一個人站在正中央,這時他突然聽到一陣低語:蒼蠅,狐狸,娃娃,屋子,於是男孩決定往一開始屋子出發
           --|失去的會再次出現,遺失的會再度回來|--  MM.CS

上一篇
DAY24神經網路(續二)
下一篇
DAY26 CNN(卷積神經網路)
系列文
數據分析方法研究和理解演算法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言